`ifndef __ysyx_23060189_CPU_HEADER__
  `define __ysyx_23060189_CPU_HEADER__

  /* 数据和地址 */
  `define ysyx_23060189_DATA_W  32
  `define ysyx_23060189_DataBus 31:0
  `define ysyx_23060189_ADDR_W  32
  `define ysyx_23060189_AddrBus 31:0

  /* PC */
  // `define ysyx_23060189_RESET_VAL 32'h80000000
  `define ysyx_23060189_RESET_VAL 32'h20000000
  `define ysyx_23060189_PC_SEL_W  2
  `define ysyx_23060189_PcSelBus  1:0
  `define ysyx_23060189_PC_4      2'b00
  `define ysyx_23060189_PC_ALU    2'b01
  `define ysyx_23060189_PC_CSR    2'b10

  /* 寄存器 */
  `define ysyx_23060189_REG_NUM    32
  `define ysyx_23060189_REG_ADDR_W 5
  `define ysyx_23060189_RegAddrBus 4:0

  `define ysyx_23060189_WB_SEL_W     2
  `define ysyx_23060189_WbSelBus     1:0
  `define ysyx_23060189_WB_SEL_PC_4  2'b00
  `define ysyx_23060189_WB_SEL_ALU   2'b01
  `define ysyx_23060189_WB_SEL_MEM   2'b10
  `define ysyx_23060189_WB_SEL_CSR   2'b11

  /* ALU */
  `define ysyx_23060189_ALU_OP_W 4
  `define ysyx_23060189_AluOpBus 3:0
  `define ysyx_23060189_ALU_XXX  4'b0000
  `define ysyx_23060189_ALU_ADD  4'b0000
  `define ysyx_23060189_ALU_CP_A 4'b0001
  `define ysyx_23060189_ALU_CP_B 4'b0010
  `define ysyx_23060189_ALU_SLTU 4'b0011
  `define ysyx_23060189_ALU_SUB  4'b0100
  `define ysyx_23060189_ALU_XOR  4'b0101
  `define ysyx_23060189_ALU_SRA  4'b0110
  `define ysyx_23060189_ALU_AND  4'b0111
  `define ysyx_23060189_ALU_SL   4'b1000
  `define ysyx_23060189_ALU_OR   4'b1001
  `define ysyx_23060189_ALU_SRL  4'b1010
  `define ysyx_23060189_ALU_SLT  4'b1011

  `define ysyx_23060189_ALU_SEL_W  2
  `define ysyx_23060189_AluSelBus  1:0
  `define ysyx_23060189_ALU_SEL_X  2'b00
  `define ysyx_23060189_ALU_SEL_R  2'b00
  `define ysyx_23060189_ALU_SEL_I  2'b01
  `define ysyx_23060189_ALU_SEL_PC 2'b10

  /* 立即数生成器 */
  `define ysyx_23060189_IMM_SEL_W 3
  `define ysyx_23060189_ImmSelBus 2:0
  `define ysyx_23060189_IMM_I     3'b000
  `define ysyx_23060189_IMM_U     3'b001
  `define ysyx_23060189_IMM_J     3'b010
  `define ysyx_23060189_IMM_S     3'b011
  `define ysyx_23060189_IMM_B     3'b100
  `define ysyx_23060189_IMM_X     3'b101

  /* 访存 */
  `define ysyx_23060189_ST_TYPE_W  2
  `define ysyx_23060189_StTypeBus  1:0
  `define ysyx_23060189_ST_XXX     2'b00
  `define ysyx_23060189_ST_SB      2'b01
  `define ysyx_23060189_ST_SH      2'b10
  `define ysyx_23060189_ST_SW      2'b11

  `define ysyx_23060189_LD_TYPE_W  3
  `define ysyx_23060189_LdTypeBus  2:0
  `define ysyx_23060189_LD_XXX     3'b000
  `define ysyx_23060189_LD_LB      3'b001
  `define ysyx_23060189_LD_LH      3'b010
  `define ysyx_23060189_LD_LW      3'b011
  `define ysyx_23060189_LD_LBU     3'b100
  `define ysyx_23060189_LD_LHU     3'b101

  /* 分支跳转 */
  `define ysyx_23060189_BR_TYPE_W 3
  `define ysyx_23060189_BrTypeBus 2:0
  `define ysyx_23060189_BR_XXX    3'b000
  `define ysyx_23060189_BR_BNE    3'b001
  `define ysyx_23060189_BR_BEQ    3'b010
  `define ysyx_23060189_BR_BGE    3'b011
  `define ysyx_23060189_BR_BGEU   3'b100
  `define ysyx_23060189_BR_BLTU   3'b101
  `define ysyx_23060189_BR_BLT    3'b110

  /* CSR */
  `define ysyx_23060189_CSR_TYPE_W 3
  `define ysyx_23060189_CsrTypeBus 2:0
  `define ysyx_23060189_CSR_N      3'b000
  `define ysyx_23060189_CSR_W      3'b001
  `define ysyx_23060189_CSR_S      3'b010
  `define ysyx_23060189_CSR_C      3'b011
  `define ysyx_23060189_CSR_P      3'b100

`endif
